さくらのIoT Platformを試してみた
ども、大瀧です。
さくらのIoT Platformは、さくらインターネットが提供する新しいIoTプラットフォームサービスです。2016年3月にαテストの公募があったので申し込んでみたところ、5月末にモジュールとサービスの利用案内が送られてきたので試してみた様子をレポートします。
この記事と同時にAWSと連携するエントリーも公開しました。こちらもどうぞ。
さくらのIoT Platformとは
さくらのIoT Platformは、さくらのIoT通信モジュールという専用デバイスから閉域網経由でIoTバックエンドまでを提供するサービスです。AWS IoTや他のクラウドが提供するIoT関連サービスは、インターネット経由を前提とし汎用のデバイスにSDKを組み込んで利用する形態が一般的なので、デバイスとネットワークの面での差別化が期待できます。バックエンドは他のクラウドサービスと連携することを想定しAPIが用意されています。現在はクローズαで、9月以降にβがリリースされる予定です。
α版の同梱物
送られてきたα版のパッケージは、ロゴ入りのスチールボックスに以下が同梱されていました。
- IoT通信モジュール SORACOM版 : 1個
- IoT通信モジュール Softbank版 : 1個
- 接続ケーブル : 2本
- 棒形アンテナ : 2本
- アンテナケーブル : 2本
- 板型アンテナ : 1個
- さくらのクラウド2万円分チケット : 1枚
- シール : 1枚
IoT通信モジュールは、Cerevoとさくらインターネットのロゴがプリントされた「モデムモジュール」にABiTのロゴがプリントされた「さくらのデバイスモジュール」がマウントされ *1、Softbank版にのみmicroSDスロットがある以外は外見はほぼ同じ構成に見えました。どちらもSIMカードは装着済みで、付近の端子の配置から付け外しを想定した造りにはなっていません(分解しない限りSIMカードは外せなさそうです)。
モジュールの取り扱いとIoT Platformの簡単な使い方が開発者向けサイトの利用ガイドにあるので、こちらに沿って試してみました。
準備するもの
- Arduino Uno R3: 1台
- USBケーブル(Aコネクタ-Bコネクタ) : 1本
- さくらインターネットのアカウント
IoT通信モジュールは5V電源で稼働し、通信インターフェース(SPI、I2C)が搭載されているので、ArduinoやIntel Edisonなどのマイコン/シングルボードコンピュータをベースとしてセンサー類と組み合わせて利用します。今回はサンプルスケッチが用意されているArduino Unoを利用します。
さくらインターネットのアカウントはIoT Platform専用のものではなく任意のアカウントでIoT Platformのコントロールパネルにアクセスできます。
通信モジュールの登録
IoT Platformのコントロールパネルの[モジュール登録]ボタンをクリックし、登録ダイアログを表示します。通信モジュールのシールに登録に必要な情報が記載されているので、[登録ID]に「ID」、[登録用パスワード]に「PASS」をそれぞれ入力、任意のモジュール名を入力して[追加する]をクリックします。
通信モジュールが一覧に登録されればOKです(IDは一意な値が自動で割り振られます)。
セットアップ
今回はSORACOM版を利用しました。まずは、通信モジュールにアンテナと接続ケーブルをセットし、Arduinoに接続します。
- 棒型アンテナをアンテナケーブルにセットし、アンテナケーブルCN2アンテナ端子に設置 *2
- 接続ケーブルをJ1端子にセットします。けっこう固くカチっというような手応えも無いので、ほどほどに刺さるところまでがんばります。
- 利用ガイド記載の信号定義を参考に、接続ケーブルをArduinoのピンに刺していきます。接続ケーブルは用途別に分かりやすく色分けされていて良いですね。Arduinoの基盤にプリントされている表記とは以下で対応させました。
- UARTのTx/RxはArduinoとデバイスで逆(TxとRx、RxとTx)
- GNDはどれでも構わない
- SPI CSは、SS(DIGITAL 10)に対応
セットした様子が以下です。
この状態でArduinoのUSBケーブルをPCやモバイルバッテリーなどに接続すると電源が入り、通信モジュールが起動します。今回はこのあとMacbookからスケッチをモジュールに書き込むので、Macに接続します。D4のLEDが2回点滅から1回点滅に変わったら、モバイルネットワークの接続完了です。コントロールパネルをリロードして、モジュールの[接続]が「オンライン」に変わっていればIoT Platformから正常に認識されています。
このあとの動作確認のために、WebSocketサービスを追加しておきましょう。コントロールパネルの[サービス追加]から「WebSocket」をクリック、任意のサービス名(今回は「testwebsocket」)を入力して「作成する」ボタンをクリックします。一覧画面から作成されたWebSocketサービスをクリックすると、モジュールから送られてくるデータをリアルタイムに表示する画面になるので、置いておきましょう。
これでセットアップ完了です。
スケッチの書き込みと動作確認
- サンプルスケッチを
git clone
などでローカルにダウンロードします。 - Arduino IDEを開きます。
- ヘッダファイル
src/SakuraAlpha.h
を読み込めるように、[スケッチ] - [ライブラリをインクルード] - [.ZIP形式のライブラリをインストール...]から、src
ディレクトリを追加し、再度[スケッチ] - [ライブラリをインクルード]から、追加された[SakuraAlpha_I2C]を選択します。 examples/SakuraAlpha_I2C/SakuraAlpha_I2C.ino
ファイルを開き、[→]ボタンでコンパイル、マイコンに書き込むを実行します。
手元で確認したときには、Arduino IDEのコンソールにavrdude: stk500_getsync() attempt 1 of 10: not in sync:
というエラーが頻発したため、以下の記事を参考にリセットして対応しました。
[ツール] - [シリアルモニタ]を選択し、以下のように送信ログが出力されていればOKです。
コントロールパネルのWebSocketサービス画面にも、受信データ(3チャネルにカウントアップする整数データ)が表示されてきます。
通信モジュールからIoT Platformに、正常にデータが送信されていますね。
連携サービスの確認
IoT Platformのα版では、以下3つの連携サービスが提供されます。
- Incoming Webhook : 特定のサーバーからデータを受信(6/6現在未実装)
- Outgoing Webhook : 特定のサーバーにデータを送信
- WebSocket : 双方向
WebSocketサービスはコントロールパネルで受信データを確認する他に、ページ記載のエンドポイントに任意のWebSocketクライアントで接続し、データを受信することができます。今回はGolang製のwesoで接続してみました。
$ weso wss://secure.sakura.ad.jp/iot-alpha/ws/<Token文字列> << {"module":"1234567890ab","type":"channels","datetime":"2016-06-06T07:43:55.024301691Z","payload":{"channels":[{"channel":0,"type":"I","value":2},{"channel":1,"type":"I","value":2},{"channel":2,"type":"I","value":2}]}} << {"module":"1234567890ab","type":"channels","datetime":"2016-06-06T07:43:56.754328578Z","payload":{"channels":[{"channel":0,"type":"I","value":3},{"channel":1,"type":"I","value":3},{"channel":2,"type":"I","value":3}]}} << {"module":"1234567890ab","type":"channels","datetime":"2016-06-06T07:43:58.574686092Z","payload":{"channels":[{"channel":0,"type":"I","value":4},{"channel":1,"type":"I","value":4},{"channel":2,"type":"I","value":4}]}} << {"module":"1234567890ab","type":"channels","datetime":"2016-06-06T07:44:00.294506092Z","payload":{"channels":[{"channel":0,"type":"I","value":5},{"channel":1,"type":"I","value":5},{"channel":2,"type":"I","value":5}]}} << {"module":"1234567890ab","type":"channels","datetime":"2016-06-06T07:44:02.114708605Z","payload":{"channels":[{"channel":0,"type":"I","value":6},{"channel":1,"type":"I","value":6},{"channel":2,"type":"I","value":6}]}} ^C $
良い感じですね。データはIoT PlatformによってJSON形式に整形され、payload
要素に含まれることがわかります。
Outgoing Webhookについても適当なホストを登録しホストでnetcatを実行、Webhookのリクエストを受信してみました。
$ while : ; do nc -l 0.0.0.0 8080; done POST / HTTP/1.1 Host: XXXXXXXX.ap.ngrok.io Accept-Encoding: gzip, deflate Accept: */* User-Agent: python-requests/2.10.0 X-Sakura-Signature: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Content-Type: application/json Content-Length: 245 X-Forwarded-For: XX.XX.XX.XX {"payload": {"channels": [{"channel": 0, "value": 27, "type": "I"}, {"channel": 1, "value": 27, "type": "I"}, {"channel": 2, "value": 27, "type": "I"}]}, "module": "1234567890ab", "datetime": "2016-06-06T07:53:07.257754759Z", "type": "channels"}^C $
POSTで、こちらもapplication/json
に整形されて飛んでくるのがわかりました。
まとめ
さくらのIoT Platform α版の様子をレポートしました。スケッチではI2C/SPIインターフェースに書き込む処理を記述するだけで動き、通信モジュールからIoT Platformへのネットワーク通信処理は完全に隠蔽されています。逆に言えば、開発者はネットワークの構成やIoT Platformまでのネットワークセキュリティを意識する必要が無いため、センサーとの連携などスケッチの開発に集中することができ、IoTシステムの新しい開発モデルとして捉えることができるのではないでしょうか。
SORACOMモデルとSoftbankモデルの2つがありますが、SORACOM Beamをはじめとする付加サービスはSORACOMのコンソール/APIにアクセスできないため利用できません。そのため現時点では2つのモデルは単純にキャリア(DOCOMO網 or Softbank網)の選択になってしまっているのは残念ですね。付加機能がモデル毎に提供されることを期待します。
さて、私の本業はクラウド連携の部分なので、次はAWSとの連携を試してみたいと思います! →こちら
参考URL
-
sakura-internet/SakuraIoTAlphaDocs: SAKURA IoT Platform Alpha Documentation
- さくらのIoT Platform α | mbed
- さくらのIoT通信モジュールのUARTの使い方 - Qiita